package br.com.medvagas.web.mb.e;

import java.io.Serializable;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

import org.apache.commons.lang.StringUtils;

import br.com.medvagas.comum.entidade.AreaAtuacao;
import br.com.medvagas.comum.entidade.Classificacao;
import br.com.medvagas.comum.entidade.Empresa;
import br.com.medvagas.comum.entidade.Municipio;
import br.com.medvagas.comum.entidade.RamoAtuacao;
import br.com.medvagas.comum.entidade.ServicoDisponivel;
import br.com.medvagas.comum.entidade.Uf;
import br.com.medvagas.comum.entidade.UsuarioEmpresa;
import br.com.medvagas.comum.enumeracao.empresa.ServicoDisponivelEnum;
import br.com.medvagas.comum.util.CacheSelectItem;
import br.com.medvagas.comum.util.JSFMensagem;
import br.com.medvagas.comum.util.UtilSpring;
import br.com.medvagas.negocio.facade.ICadastrarEmpresa;

@ManagedBean
@ViewScoped
public class CadastrarEmpresaMB implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private Empresa empresa;
	private List<String> lsServicoDisponivelString;
	private String dsOutroServicoDisponivel;
	
	private List<SelectItem> lsAreaAtuacao;
	private List<SelectItem> lsUf;
	private List<SelectItem> lsMunicipio;
	private List<SelectItem> lsRamoAtuacao;
	private List<SelectItem> lsClassificacao;
	
	// TODO remover esse propriedade e tirar da pagina - TESTE
	private String execInit;
	
	public CadastrarEmpresaMB() {
		UsuarioEmpresa ue = new UsuarioEmpresa();
		
		empresa = new Empresa();
		empresa.setUsuarioEmpresa(ue);
		
		lsAreaAtuacao = CacheSelectItem.get(AreaAtuacao.class.getName());
		lsUf = CacheSelectItem.get(Uf.class.getName());
		lsMunicipio = Collections.emptyList();
		lsRamoAtuacao = CacheSelectItem.get(RamoAtuacao.class.getName());
		lsClassificacao = CacheSelectItem.get(Classificacao.class.getName());
	}
	
	public String cadastrar() {
		UsuarioEmpresa ue = empresa.getUsuarioEmpresa();
		if (!ue.getAceitouTermoServico()) {
			JSFMensagem.addMenssagemErro("MSG_0011");
			return null;
		} else {
			if (lsServicoDisponivelString != null && !lsServicoDisponivelString.isEmpty()) {
				Set<ServicoDisponivel> stServicoDisponivel = new LinkedHashSet<ServicoDisponivel>();
				ServicoDisponivel sd;
				String vlOutro = ServicoDisponivelEnum.OUTRO.getValor();
				for (String codigoServico : lsServicoDisponivelString) {
					sd = new ServicoDisponivel();
					sd.setCodigoServico(codigoServico);
					if (vlOutro.equals(codigoServico)) {
						sd.setDsOutro(dsOutroServicoDisponivel);
					}
					stServicoDisponivel.add(sd);
				}
				empresa.setStServicoDisponivel(stServicoDisponivel);
			}
		
			// necessario! id pode estar preenchido caso tenha dado erro na persistencia e esteja sendo re-submetido depois de uma mensagem de erro
			ue.setIdUsuarioEmpresa(null);
			empresa.setIdEmpresa(null);
			
			ICadastrarEmpresa ce = (ICadastrarEmpresa) UtilSpring.getBean(ICadastrarEmpresa.NOME);
			ce.cadastrarEmpresa(empresa);
			
			JSFMensagem.addMenssagemInfo("MSG_0012");
			return "loginempresa";
		}
	}
	
	public void onchangeEstado(AjaxBehaviorEvent event) {
		if (StringUtils.isNotEmpty(empresa.getSiglaUf())) {
			lsMunicipio = CacheSelectItem.get(empresa.getSiglaUf() + Municipio.class.getName());
		} else {
			empresa.setCodIbge(null);
			lsMunicipio = Collections.emptyList();
		}
	}
	
	public Empresa getEmpresa() {
		return empresa;
	}
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	public List<SelectItem> getLsAreaAtuacao() {
		return lsAreaAtuacao;
	}
	public void setLsAreaAtuacao(List<SelectItem> lsAreaAtuacao) {
		this.lsAreaAtuacao = lsAreaAtuacao;
	}
	public List<SelectItem> getLsUf() {
		return lsUf;
	}
	public void setLsUf(List<SelectItem> lsUf) {
		this.lsUf = lsUf;
	}
	public List<SelectItem> getLsMunicipio() {
		return lsMunicipio;
	}
	public void setLsMunicipio(List<SelectItem> lsMunicipio) {
		this.lsMunicipio = lsMunicipio;
	}
	public List<SelectItem> getLsClassificacao() {
		return lsClassificacao;
	}
	public void setLsClassificacao(List<SelectItem> lsClassificacao) {
		this.lsClassificacao = lsClassificacao;
	}
	public List<SelectItem> getLsRamoAtuacao() {
		return lsRamoAtuacao;
	}
	public void setLsRamoAtuacao(List<SelectItem> lsRamoAtuacao) {
		this.lsRamoAtuacao = lsRamoAtuacao;
	}
	public List<String> getLsServicoDisponivelString() {
		return lsServicoDisponivelString;
	}
	public void setLsServicoDisponivelString(List<String> lsServicoDisponivelString) {
		this.lsServicoDisponivelString = lsServicoDisponivelString;
	}
	public String getDsOutroServicoDisponivel() {
		return dsOutroServicoDisponivel;
	}
	public void setDsOutroServicoDisponivel(String dsOutroServicoDisponivel) {
		this.dsOutroServicoDisponivel = dsOutroServicoDisponivel;
	}
	public String getExecInit() {
		return execInit;
	}
	public void setExecInit(String execInit) {
		this.execInit = execInit;
	}
	
}
